One way users can authenticate themselves to servers over a network (and thereby gain access to services) is through the use of a challenge-response protocol. When a client attempts to connect to a server, the server sends a challenge string to the client. The client answers with a username and a response to the challenge that uses the user's password as a cryptographic key and the server's challenge as the message. The server maintains a listing of users and their passwords. The server uses its stored information in an attempt to duplicate the response provided by the client. If the client's response and the server-generated recreation match, the authentication is successful.
Approaches such as having the server store a hash of the user's password, rather than the password itself, are used to help protect the authentication scheme against eavesdroppers. Unfortunately, while hashes obfuscate a user's password, attacks such as dictionary attacks and brute-force attacks, and the use of rainbow tables can nonetheless allow nefarious individuals to circumvent traditional challenge-response schemes. Another technique used to help protect the authentication scheme is to harden the server, such as by disallowing read access to certain files, limiting access to services, and locating servers in physically secure locations. Unfortunately, taking such precautions may not be possible (e.g., in the case of physically securing the server) or may lead to a tradeoff between security (limiting access to services) and usability (providing access to services).
Therefore, it would be desirable to have a better authentication protocol.